package com.itheima.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

@Aspect//aop 切面类
//@Component
@Slf4j
public class RecordTimeAspect {
    //第一个* 表示任意返回值
    //第二个* 表示任意方法
    //.. 表示任意参数
    //Around环绕通知，返回类型必须是object
    //Pointcut  抽取公共的切点表达式，方便重复使用
    @Pointcut("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public void pc() {}

    @Around("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
        //开始时间
        //@Before
        try {
            long start = System.currentTimeMillis();
            //调用目标方法
            Object result = joinPoint.proceed();
            //结束时间
            //@AfterReturning
            long end = System.currentTimeMillis();
            log.info("方法执行耗时：{}毫秒", end - start);
            return result;
        } catch (Throwable e) {
            //@AfterThrowing
            throw new RuntimeException(e);
        } finally {
            //@After
        }
    }
    @Before("pc()")
    public void before() {
        log.info("方法开始执行...");
    }
    @After("pc()")
    public void after() {
        log.info("方法结束执行,无论是否发生异常都会执行...");
    }
    @AfterReturning("pc()")
    public void afterReturning() {
        log.info("方法正常返回值后执行...");
    }
    @AfterThrowing("pc()")
    public void afterThrowing() {
        log.info("方法发生异常后执行...");
    }
}
